/*
 *      Estado              Metodo
 *      OK                    eliminarBanners
 *      OK                    insertarBanners
 *      OK                    listarBanners
 *      OK                    obtenerBanners
 */

package


gestores.administracion;

import dal.ArticuloDAL;
import dal.CampaniaDAL;

import excepciones.AvwException;

import java.util.ArrayList;
import java.util.HashMap;

import java.util.logging.Level;

import java.util.logging.Logger;

import negocio.ArticuloCampania;
import negocio.ArticuloWeb;
import negocio.BannersWeb;
import negocio.CampaniaWeb;

import util.Utiles;

public class GestorBanners {
    
    static final Logger logger = Utiles.iniciarLogger("GestorBanners", false);

    
    /**
     * Constructor
     */
    public GestorBanners() {
    }

    /**
     * Lista los banners de una campania
     * @param camCodigo codigo de la campania
     * @return ArrayList de HashMap de los banners
     */
    public static ArrayList<HashMap> listarBannersPorCampania(String camCodigo)throws NullPointerException {
        ArrayList<HashMap> banners = new ArrayList<HashMap>();

        try {
            // Recorro la lista de banners
            for (BannersWeb bannersNeg: 
                 CampaniaDAL.listarBannersPorCampania(new CampaniaWeb(camCodigo))) {
                HashMap bannerHash = new HashMap();
    
                // Cargo los datos del banners
                bannerHash.put("banCodigo", bannersNeg.getBanCodigo());
                bannerHash.put("banNombre", bannersNeg.getBanNombre());
                bannerHash.put("banUrl", bannersNeg.getBanUrl());
    
                // Agregamos al array el banners
                banners.add(bannerHash);
            }
        }
        catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }

        return banners;
    }

    /**
     * Inserta los Banners de una campania
     * @param camCodigo codigo de la campania
     * @param bannerNombre Nombre de los Banners de la campania
     * @param bannerUrl Url del banner que se va a insertar
     * @param articulos arrayList de los articulos del banner de la campania
     */
    public static void insertarBanners(String camCodigo, String bannerNombre, 
                                String bannerUrl, 
                                ArrayList<String> articulos) throws AvwException {

        //se crea la campania
        CampaniaWeb campaniaWeb = new CampaniaWeb(camCodigo);
        BannersWeb banner = new BannersWeb();
        ArrayList<ArticuloWeb> arrayArticulos = new ArrayList<ArticuloWeb>();


        banner.setBanNombre(bannerNombre);
        banner.setBanUrl(bannerUrl);


        for (String artCodigo: articulos) {
            ArticuloWeb articulo = new ArticuloWeb(artCodigo);
            arrayArticulos.add(articulo);
        }

        try{
            CampaniaDAL.insertarBanners(campaniaWeb, banner, arrayArticulos);
        }catch (AvwException e) {
            logger.log(Level.SEVERE,e.getMensaje(),e);
        }
    }
    /**
     * Modificar los Banners de una campania
     * @param camCodigo codigo de la campania
     * @param bannerNombre Nombre de los Banners de la campania
     * @param bannerUrl Url del banner que se va a insertar
     * @param articulos arrayList de los articulos del banner de la campania
     */
    public static void modificarBanners(String camCodigo, String bannerNombre, 
                                String bannerUrl, String banCodigo,
                                ArrayList<String> articulos) throws AvwException {

        //se crea la campania
        CampaniaWeb campaniaWeb = new CampaniaWeb(camCodigo);
        BannersWeb banner = new BannersWeb(banCodigo);
        ArrayList<ArticuloCampania> arrayArticulos = new ArrayList<ArticuloCampania>();


        banner.setBanNombre(bannerNombre);
        banner.setBanUrl(bannerUrl);


        for (String artCodigo: articulos) {
            ArticuloCampania articulo = new ArticuloCampania();
            articulo.setArcArticulo(new ArticuloWeb(artCodigo));
            arrayArticulos.add(articulo);
        }

        try{
            CampaniaDAL.modificarBanners(campaniaWeb, banner, arrayArticulos);
        }catch (AvwException e) {
            logger.log(Level.SEVERE,e.getMensaje(),e);
        }
    }
    
    public static void insertarArticulosBanners(String camCodigo, String banCodigo,
                                ArrayList<String> articulos) throws AvwException {

        //se crea la campania
        CampaniaWeb campaniaWeb = new CampaniaWeb(camCodigo);
        BannersWeb banner = new BannersWeb(banCodigo);
        banner = CampaniaDAL.obtenerBanners(banner);
        ArrayList<ArticuloCampania> arrayArticulos = new ArrayList<ArticuloCampania>();

        for (String artCodigo: articulos) {
            ArticuloCampania articulo = new ArticuloCampania();
            articulo.setArcArticulo(new ArticuloWeb(artCodigo));
            arrayArticulos.add(articulo);
        }

        try{
            CampaniaDAL.modificarBanners(campaniaWeb, banner, arrayArticulos);
        }catch (AvwException e) {
            logger.log(Level.SEVERE,e.getMensaje(),e);
        }
    }
    
    /**
     * Elimina los banners
     * @param banCodigo codigo del banner que se desea eliminar
     */
    public static void eliminarBanners(String banCodigo) {
        try{
            CampaniaDAL.eliminarBanners(new BannersWeb(banCodigo));
        }catch(AvwException e){
            logger.log(Level.SEVERE,e.getMessage(),e);
        }
    }
    
    /**
     * 
     * @param banCodigo es el codigo del banner que se desea obtener
     * @return HashMap con los siguientes datos: codigo, nombre, url y codigo y nombre de los articulos asociados al banners
     */
    public static HashMap obtenerBanners(String banCodigo, String camCodigo)throws NullPointerException {
        BannersWeb bannersWeb = new BannersWeb(banCodigo);
        CampaniaWeb campaniaWeb = new CampaniaWeb(camCodigo);
        HashMap bannerHash = new HashMap();
        ArrayList<HashMap> articulos = new ArrayList<HashMap>();
        try {
            
            bannersWeb = CampaniaDAL.obtenerBanners(bannersWeb);
            
            // Cargo los datos del banners
            bannerHash.put("banCodigo", bannersWeb.getBanCodigo());
            bannerHash.put("banNombre", bannersWeb.getBanNombre());
            bannerHash.put("banUrl", bannersWeb.getBanUrl());
            for(ArticuloCampania articuloCampania :CampaniaDAL.obtenerArticulosCampaniaPorBanners(bannersWeb, campaniaWeb)){
                HashMap articuloBanners = new HashMap();
                articuloBanners.put("artCodigo", 
                        articuloCampania.getArcArticulo().getArtCodigo());
                articuloBanners.put("artNombre", 
                        articuloCampania.getArcArticulo().getArtNombre());
                articulos.add(articuloBanners);
            }
            bannerHash.put("articulos", articulos);
    
        }
        catch (AvwException e) {
            logger.log(Level.SEVERE, e.getMensaje(), e);
        }

        return bannerHash;
    }

    public static ArrayList<HashMap> obtenerArticulosCampania(String camCodigo, 
            int opcionFiltro, String filtro)throws AvwException{
                ArrayList<HashMap> arr = new ArrayList<HashMap>();
        HashMap hashMap;
        ArrayList<ArticuloWeb> articulosNeg = null;
        
        // Obtengo todos los articulos
        articulosNeg = ArticuloDAL.listarArticulosFiltro(opcionFiltro,filtro, 
                new CampaniaWeb(camCodigo));
        
        // Recorro el array
        for (ArticuloWeb articulo: articulosNeg) {
            hashMap = new HashMap();
            hashMap.put("artCodigo", articulo.getArtCodigo());
            hashMap.put("artNombre", articulo.getArtNombre());
            hashMap.put("artDescripcion", articulo.getArtDescripcion());
            hashMap.put("cawCodigo", articulo.getArwCategoria().getCawCodigo());
            hashMap.put("cawNombre", articulo.getArwCategoria().getCawNombre());
            hashMap.put("marCodigo", articulo.getArtMarcaCodigo().getMarCodigo());
            hashMap.put("marNombre", articulo.getArtMarcaCodigo().getMarNombre());
            
            arr.add(hashMap);
        }
        
        if(arr == null){throw new AvwException("Error.");}
        return arr;
    }

    public static String obtenerArticulosCampaniaPorUrlBanners(String banUrl)throws AvwException{
        StringBuilder xml = new StringBuilder();
        ArrayList<ArticuloCampania> articulos = 
            new ArrayList<ArticuloCampania>();
        BannersWeb banners = new BannersWeb();
        banners.setBanUrl(banUrl);

        try {
            articulos = 
                    CampaniaDAL.obtenerArticulosCampaniaPorUrlBanners(banners);

            xml.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
            xml.append("<articulos> ");
            for (ArticuloCampania articulo: articulos) {
                xml.append("<link ARTICULO=\"");
                xml.append(articulo.getArcArticulo().getArtCodigo());
                xml.append("\" ");
                xml.append("FOTO=\"");
                
                HashMap articuloWebHash = articulo.getArcArticulo().obtenerDatosResumen();
                ArrayList<HashMap> fotos = (ArrayList<HashMap>)articuloWebHash.get("fotos");
                if (fotos.size() > 0){
                    HashMap foto = fotos.get(0);
                    xml.append(foto.get("fawCodigo"));
                }else{
                    xml.append("sinFoto");
                }
                xml.append("\" ");
                xml.append("CATEGORIA=\"");
                xml.append(articuloWebHash.get("cawNombre"));
                xml.append("\" ");
                xml.append("MARCA=\"");
                xml.append(articuloWebHash.get("marCodigo"));
                xml.append("\" ");
                xml.append("DESCRIPCION=\"");
                // No colocamos la descripcion, porque no se va a mostrar
                //xml.append(articuloWebHash.get("artDescripcion"));
                xml.append("\" ");
                xml.append("NOMBRE=\"");
                xml.append(articuloWebHash.get("artNombre"));
                xml.append("\" ");
                xml.append("PRECIODESCUENTO=\"");
                xml.append(articulo.getArcPrecioDescuento());
                xml.append("\" ");
                xml.append("PRECIOLISTA=\"");
                xml.append(articulo.getArcPrecioLista());
                xml.append("\"/>");
            }
            xml.append("</articulos> ");
        } catch (AvwException e) {
        }

        return xml.toString();
    }

    public static void eliminarArticulosBanners(String banCodigo, String artCodigo) 
            throws AvwException{
        BannersWeb bannersWeb = new BannersWeb(banCodigo);
        ArticuloWeb articuloWeb = new ArticuloWeb(artCodigo);
        ArticuloCampania articuloCampania = new ArticuloCampania();
        articuloCampania.setArcArticulo(articuloWeb);
        CampaniaDAL.eliminarArticulosBanners(articuloCampania, bannersWeb);
    }
}
